﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using 旅游管理系统.Models;
using System.IO; //读取文件时用的 IO框架
using System.Reflection; //反射框架
using Newtonsoft.Json; //对 Json文件的处理的框架


namespace 旅游管理系统.Database
{
    /// <summary>
    /// 上下文关系对象，即代码与数据之间的连接器，在代码和数据之间引导数据的流动
    /// </summary>
    public class AppDbContext : DbContext //为 Framework中的 DbContext
    {
        //上下文关系对象类，即代码与数据库之间的连接器,引导数据的流动
        public AppDbContext(DbContextOptions<AppDbContext> options)
            : base(options)
        {

        }

        //使用 DbSet 来进行模型的映射，每个模型都要用一个 DbSet 来映射给一张数据库的表
        //模型中有两个数据模型，即要用到两个 DbSet
        public DbSet<TouristRoute> TouristRoutes { get; set; }
        public DbSet<TouristRoutePicture> TouristRoutePictures { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //// HasData 函数是用来提供模型的数据支持，
            //modelBuilder.Entity<TouristRoute>().HasData(new TouristRoute()
            //{
            //    Id = Guid.NewGuid(),
            //    Title = "ceshititle",
            //    Description = "shuoming ",
            //    OriginalPrice = 0,
            //    CreateTime = DateTime.UtcNow
            //}) ;

            //通过文件地址来读取文件
            //获得档期拿项目的文件夹地址 ，使用C#的反射机制 Path.GetDirectoryName()
            var touristRouteJsonData = File.ReadAllText(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) +  @"/Database/touristRoutesMockData.json");
            //把这些字符串转化为 Json的对象，然后再由 Json的对象转化为旅游路线的数据模型
            // 对于 Json对象的处理，一般都会使用 Newtonsoft.Json框架
            //将这些数据以旅游路线列表的形式来处理     DeserializeObject<列表类型> 反序列化类型
            IList<TouristRoute> touristRoutes = JsonConvert.DeserializeObject<IList<TouristRoute>>(touristRouteJsonData);
            modelBuilder.Entity<TouristRoute>().HasData(touristRoutes);


            var touristRoutePictureJsonData = File.ReadAllText(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"/Database/touristRoutePicturesMockData.json");
            IList<TouristRoutePicture> touristRoutePictures = JsonConvert.DeserializeObject<IList<TouristRoutePicture>>(touristRoutePictureJsonData);
            modelBuilder.Entity<TouristRoutePicture>().HasData(touristRoutePictures);


            //调用 modelBuilder手动构建数据模型与数据表的关系，modelBuilder是在创建数据模型与数据库表映射关系的时候起补充说明用的
            base.OnModelCreating(modelBuilder); 
        }
    }
}
